#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
struct node {
    ll x;
    ll y;
};
bool compare(node a, node b, node c) {
    return (b.x-a.x)*(c.y-b.y) >= (c.x-b.x)*(b.y-a.y);
}
node q[100005];
ll t[100005];
int st,en;
ll dis[100005];
ll dp[105][100005];
ll sum[100005];
int main() {
    int n,m,p;
    scanf("%d%d%d", &n, &m, &p);
    ll tmp;
    dis[1]=0;
    for (int i=2; i<=n; i++) {
        scanf("%lld", &tmp);
        dis[i]=dis[i-1]+tmp;
    }
    int num;
    sum[0]=0;
    for (int i=1; i<=m; i++) {
        scanf("%d%lld", &num, &tmp);
        t[i]=tmp-dis[num];
    }
    sort(t+1, t+m+1);
/*    cout<<"t: ";
    for (int i=1; i<=m; i++) cout<<t[i]<<' ';
    cout<<endl;*/
    sum[0]=0;
    for (int i=1; i<=m; i++) {
        sum[i]=sum[i-1]+t[i];
    }
    memset(dp, 0x3f, sizeof(dp));
    node z;
    for (int i=1; i<=p; i++) {
        st=en=0;
        z.x=0;
        z.y=0;
        q[en++]=z;
        q[en++]=z;
        for (int j=1; j<=m; j++) {
            z.x=j-1;
            z.y=sum[j-1]+dp[i-1][j-1];
            while (st+1<en && !compare(q[en-2], q[en-1], z)) en--;
            q[en++]=z;
            while (st+1<en && -t[j]*q[st].x+q[st].y >= -t[j]*q[st+1].x+q[st+1].y) st++;
            dp[i][j]=-t[j]*q[st].x+q[st].y+j*t[j]-sum[j];
/*            cout<<"st,e  "<<st<<' '<<en<<endl;
            for (int l=st; l<en; l++) cout<<q[l].x<<":"<<q[l].y<<' ';
            cout<<endl;*/
        }
    }
/*    for (int i=0; i<=p; i++) {
        for (int j=0; j<=m; j++) cout<<dp[i][j]<<' ';
        cout<<endl;
    } */
    printf("%lld\n", dp[p][m]);
    return 0;
}
